package com.oreilly.demo.android.pa.audioplayer;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.VideoView;
public class VideoRecorder extends Activity implements Runnable, SurfaceHolder.Callback {
private MediaRecorder mediarecorder;
private static final String MEDIAFILE= "/sdcard/videorecordexample.mp4";
private boolean recordablestate = false;
private int time = 0;
private VideoView videoview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupView();
}
@Override
public void onDestroy() {
super.onDestroy();
recordablestate = false;
if(mediarecorder != null) mediarecorder.release();
}
private void setupView() {
setContentView(R.layout.videorecorder);
findViewById(R.id.recordstop).setEnabled(false);
videoview = (VideoView) findViewById(R.id.videosurface);
final SurfaceHolder holder = videoview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
findViewById(R.id.recordstop).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
recordOrStop(holder);
}
});
findViewById(R.id.play).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
playVideo();
}
});
}
private void recordOrStop(SurfaceHolder holder) {
if(!recordablestate) {
try {
File mediafile = new File(MEDIAFILE);
if(mediafile.exists()) {
mediafile.delete();
}
mediafile = null;
recordablestate = true;
ImageButton button = (ImageButton) findViewById(R.id.recordstop);
button.setImageResource(R.drawable.stop);
findViewById(R.id.play).setVisibility(View.GONE);
if(mediarecorder == null) mediarecorder = new MediaRecorder();
mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediarecorder.setOutputFile(MEDIAFILE);
mediarecorder.setPreviewDisplay(holder.getSurface());
mediarecorder.prepare();
mediarecorder.start();
(new Thread(this)).start();
} catch (Exception e) {
e.printStackTrace();
}
} else {
recordablestate = false;
mediarecorder.stop();
mediarecorder.reset();
ImageButton button = (ImageButton) findViewById(R.id.recordstop);
button.setImageResource(R.drawable.record);
findViewById(R.id.play).setVisibility(View.VISIBLE);
}
}
private final Handler timeupdater = new Handler() {
@Override
public void handleMessage(Message msg) {
time++;
((TextView) findViewById(R.id.time)).setText(""+time+" secs");
}
};
@Override
public void run() {
try {
time = 0;
timeupdater.sendEmptyMessage(0);
while(recordablestate) {
Thread.sleep(1000); // per sec
timeupdater.sendEmptyMessage(0);
}
} catch (Exception t) { }
}
private void playVideo() {
finish();
Intent intent = new Intent(this, VideoPlayer.class);
intent.putExtra(VideoPlayer.VIDEOFILEPATH, MEDIAFILE);
startActivity(intent);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
findViewById(R.id.recordstop).setEnabled(true);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}